package login

import (
	"permissions/api/cache"
	"permissions/model"

	"gitee.com/cloudapex/ulern/htp"
	"gitee.com/cloudapex/ulern/util"
	"github.com/gin-gonic/gin"
)

/*
 * 描述: 登陆时的权限数据
 * 路由: /login/permis
 * 方法: GET
 *********************************************************************/
const ( // 错误码
	EUIP_TokenPhone   htp.ECode = iota + 1 // 手机号解析失败
	EUIP_UserNotFound                      // 用户不存在
)

type UIPermis struct {
}

func (this *UIPermis) Handle(c *gin.Context) htp.Response {
	user := model.CurrUser(c)

	// 废弃: 用手机号关联用户
	// phone, _ := strconv.ParseInt(user.Phone, 10, 64)
	// if phone == 0 {
	// 	return htp.RespErr(EUIP_TokenPhone, "手机号解析失败", nil)
	// }

	// 更换: 两个Id保持一致
	mUsr := model.User{Id: user.TheUID()}
	if has, err := mUsr.Load(); !has || err != nil {
		if err != nil {
			return htp.RespDBErr("", err)
		}
		return htp.RespErr(EUIP_UserNotFound, "用户不存在", err)
	}

	aIds, err := (&model.UserRole{UserId: mUsr.Id}).FindIds()
	if err != nil {
		return htp.RespDBErr("", err)
	}
	rIds, err := (&model.UserGroupWithGroupRole{UserGroup: model.UserGroup{UserId: mUsr.Id}}).FindRoleIds()
	if err != nil {
		return htp.RespDBErr("", err)
	}
	aIds = append(aIds, rIds...)

	// 拥有的权限
	mRPP := model.RolePowerWithPower{RolePower: model.RolePower{CInRIds: aIds}}

	mlist, err := mRPP.FindMItems(model.EPower_Menu) // 拥有的菜单
	if err != nil {
		return htp.RespDBErr("", err)
	}

	plist, err := mRPP.FindPItems(model.EPower_Func) // 拥有的功能
	if err != nil {
		return htp.RespDBErr("", err)
	}

	util.Goroutine("HandUserRoles", func() { // 更新用户角色缓存
		if err := cache.HandUserRoles([]int64{mUsr.Id}, true); err != nil {
			util.Error("UIPermis.HandUserRoles err:%v", err)
		}
		if err := cache.HandUserDevce(mUsr.Id, c.GetHeader("User-Agent"), c.GetHeader("User-Device")); err != nil {
			util.Error("UIPermis.HandUserDevce err:%v", err)
		}
	})

	return htp.RespOK("", &struct {
		MList []model.MenuItem  `json:"mlist"` // 菜单树
		PList []model.PowerItem `json:"plist"` // 功能权限列表
	}{mlist, plist})
}
